class Solution {
public:
    using LL = long long;
    
    LL dp[110][110];
    
    int uniquePathsWithObstacles(vector<vector<int>>& g) {
        int n = g.size(), m = g[0].size();
        
        dp[0][0] = g[0][0] == 1 ? 0 : 1;
        
        for (int i = 1; i < n; i ++ ) {
            if (g[i][0]) dp[i][0] = 0;
            else dp[i][0] = dp[i - 1][0];
        }
        
        for (int i = 1; i < m; i ++ ) {
            if (g[0][i]) dp[0][i] = 0;
            else dp[0][i] = dp[0][i -1];
        }
        
        for (int i = 1; i < n; i ++ ) 
            for (int j = 1; j < m; j ++ ) 
                if (!g[i][j]) 
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        
        return dp[n - 1][m - 1];
    }
};
